namespace SmartMathLibrary
{
    /// <summary>
    /// Interface to implement a GeneralQuaternionVector class.
    /// </summary>
    public interface IGeneralQuaternionVector
    {
        /// <summary>
        /// Gets or sets the components of the quaternion vector.
        /// </summary>
        /// <value>The components of the quaternion vector.</value>
        Quaternion[] VectorData { get; set; }

        /// <summary>
        /// Counts the components of the quaternion vector.
        /// </summary>
        /// <value>The components of the quaternion vector.</value>
        int Count { get; }

        /// <summary>
        /// Gets the length of the vector.
        /// </summary>
        /// <value>The length of the vector.</value>
        double Length { get; }

        /// <summary>
        /// Gets or sets the <see cref="SmartMathLibrary.Quaternion"/> at the specified index.
        /// </summary>
        /// <value>The quaternion component of the vector at the specified position.</value>
        Quaternion this[int index] { get; set; }

        /// <summary>
        /// Extracts the real number part of the quaternion values into a new vector.
        /// </summary>
        /// <returns>The real number part of the quaternion values.</returns>
        GeneralVector ExtractRealNumberPartVector();

        /// <summary>
        /// Extracts the i number part of the quaternion values into a new vector.
        /// </summary>
        /// <returns>The i number part of the quaternion values.</returns>
        GeneralVector ExtractINumberPartVector();

        /// <summary>
        /// Extracts the j number part of the quaternion values into a new vector.
        /// </summary>
        /// <returns>The j number part of the quaternion values.</returns>
        GeneralVector ExtractJNumberPartVector();

        /// <summary>
        /// Extracts the k number part of the quaternion values into a new vector.
        /// </summary>
        /// <returns>The k number part of the quaternion values.</returns>
        GeneralVector ExtractKNumberPartVector();

        /// <summary>
        /// Gets the component value.
        /// </summary>
        /// <param name="index">The index of the component.</param>
        /// <returns>The vector component value at the over given index</returns>
        Quaternion GetComponent(int index);

        /// <summary>
        /// Sets the component value at a specified position.
        /// </summary>
        /// <param name="index">The index of the component.</param>
        /// <param name="value">The new value of the component.</param>
        void SetComponent(int index, Quaternion value);

        /// <summary>
        /// Counts the components of the vector.
        /// </summary>
        /// <value>The number of components of the vector.</value>
        GeneralQuaternionVector Copy();

        /// <summary>
        /// Converts the data of the vector to an array of quaternions.
        /// </summary>
        /// <returns>An array of quaternions.</returns>
        Quaternion[] ToArray();
    }
}